//Motorista.java
// Classe de controle do motorista
package controle;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import visao.MotoristaTableModel;

/**
 * @author Diego Heusser
 * @author Eder Schramm
 */
public class Motorista {

    private visao.CadastroMotorista cadMotorista;
    private final visao.Menu menu;
    private visao.Consulta consulta;
    private final dao.MotoristaDAO daoMotorista;
    private boolean alterar;

    public Motorista(visao.Menu menu) {
        this.menu = menu;
        dao.DAOFactory factory = dao.DAOFactory.getDAOFactory();
        daoMotorista = factory.getMotoristaDAO();
        alterar = false;
    }

    public void cadastrar() {
        cadMotorista = new visao.CadastroMotorista();
        ouvintesCad();
        cadMotorista.setVisible(true);
    }

    public void consultar() {
        consulta = new visao.Consulta(menu, true);
        atualizaTabela(daoMotorista.listar());
        ouvintesCon();
        consulta.setVisible(true);
    }
    
    public boolean apagarDados(){
        dao.DAOFactory factory = dao.DAOFactory.getDAOFactory();
        return factory.getMotoristaDAO().apagarDados();
    }
    
    public void criarTabela() throws Exception {
        daoMotorista.criarTabela();
    }
 
    private void ouvintesCon() {
        consulta.btCancelar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cancelarBusca();
            }
        });
        consulta.btEditar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                editar();
            }
        });
        consulta.btPesquisar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pesquisar();
            }
        });
        consulta.btRemover.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                removerMotorista();
            }
        });
        consulta.btListarFisico.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    atualizaTabela(daoMotorista.listarFisico());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(consulta, ex.getMessage(),
                            "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }

    private void editar() {
        int linha = consulta.tabela.getSelectedRow();
        alterar = true;
        menu.setVisible(false);
        consulta.setVisible(false);
        cadastrar();
        cadMotorista.tfID.setText(String.valueOf(consulta.tabela.getValueAt(linha, 0)));
        cadMotorista.tfNome.setText(String.valueOf(consulta.tabela.getValueAt(linha, 1)).replaceAll(" ", ""));
        cadMotorista.tfHabilitacao.setText(String.valueOf(consulta.tabela.getValueAt(linha, 2)).replaceAll(" ", ""));
        cadMotorista.cbGenero.setSelectedItem(String.valueOf(consulta.tabela.getValueAt(linha, 3)).replaceAll(" ", ""));
        cadMotorista.spDataNasc.setValue(consulta.tabela.getValueAt(linha, 4));
    }

    private void removerMotorista() {
        int[] linhas = consulta.tabela.getSelectedRows();
        if (linhas.length > 0) {
            for (int i = 0; i < linhas.length; i++) {
                int id = (int) consulta.tabela.getValueAt(linhas[i], 0);
                daoMotorista.remover(id);
            }
            atualizaTabela(daoMotorista.listar());
        } else {
            JOptionPane.showMessageDialog(consulta, "Selecione um Motorista!");
        }
    }

    private void cancelarBusca() {
        consulta.tfPesquisa.setText(null);
        atualizaTabela(daoMotorista.listar());
    }

    private void pesquisar() {
        atualizaTabela(daoMotorista.listar(consulta.tfPesquisa.getText()));
    }

    private void ouvintesCad() {
        cadMotorista.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                controle.Menu controlador = new controle.Menu();
                controlador.executar();
                cadMotorista.setVisible(false);
            }
        });
        cadMotorista.btSalvar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (alterar) {
                    alterar();
                } else {
                    salvar();
                }
            }
        });
        cadMotorista.tfID.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent e) {
                verificaId();
            }
        });
        cadMotorista.btCancelar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                limparTela();
                alterar = false;
            }
        });
    }

    private void verificaId() {
        if (alterar) {
            if (!cadMotorista.tfID.getText().equals("")) {
                if (daoMotorista.idValido(
                        Integer.parseInt(cadMotorista.tfID.getText()))) {
                    cadMotorista.tfID.setForeground(Color.red);
                } else {
                    cadMotorista.tfID.setForeground(Color.black);
                }
            }
        } else {
            if (!cadMotorista.tfID.getText().equals("")) {
                if (daoMotorista.idValido(
                        Integer.parseInt(cadMotorista.tfID.getText()))) {
                    cadMotorista.tfID.setForeground(Color.black);
                } else {
                    cadMotorista.tfID.setForeground(Color.red);
                }
            }
        }
    }

    private boolean maioridade(Date nasc) {
        Date hj = new Date();
        int anoNasc = nasc.getYear();
        int anoHj = hj.getYear();
        int idade = anoHj - anoNasc;
        return idade >= 18;
    }

    private void limparTela() {
        cadMotorista.cbGenero.setSelectedIndex(0);
        cadMotorista.tfHabilitacao.setText(null);
        cadMotorista.spDataNasc.setValue(new Date());
        cadMotorista.tfID.setText(null);
        cadMotorista.tfNome.setText(null);
    }

    private void salvar() {
        modelo.Motorista umMotorista = new modelo.Motorista();
        umMotorista.setId(Integer.parseInt(
                cadMotorista.tfID.getText()));
        umMotorista.setNome(cadMotorista.tfNome.getText());
        umMotorista.setGenero((String) cadMotorista.cbGenero.getSelectedItem());
        java.util.Date dt = (java.util.Date) cadMotorista.spDataNasc.getValue();
        umMotorista.setDataNascimento(new java.sql.Date(dt.getTime()));
        umMotorista.setHabilitacao(cadMotorista.tfHabilitacao.getText());
        if (cadMotorista.tfID.getForeground().equals(Color.black)) {
            if (maioridade(umMotorista.getDataNascimento())) {
                if (daoMotorista.inserir(umMotorista)) {
                    JOptionPane.showMessageDialog(cadMotorista, "Salvo!");
                } else {
                    JOptionPane.showMessageDialog(cadMotorista, "Não foi possível salvar!",
                            "Erro", JOptionPane.ERROR_MESSAGE);
                }
                limparTela();
            } else {
                JOptionPane.showMessageDialog(cadMotorista, "A Idade mínima permitida é de 18 anos");
                cadMotorista.spDataNasc.requestFocus();
            }
        } else {
            JOptionPane.showMessageDialog(cadMotorista, "O campo 'ID' é inválido!");
            cadMotorista.tfID.requestFocus();
        }
    }

    private void atualizaTabela(List<modelo.Motorista> lista) {
        MotoristaTableModel modelo = new MotoristaTableModel(lista);
        consulta.tabela.setModel(modelo);
    }

    private void alterar() {
        modelo.Motorista umMotorista = new modelo.Motorista();
        umMotorista.setId(Integer.parseInt(
                cadMotorista.tfID.getText()));
        umMotorista.setNome(cadMotorista.tfNome.getText());
        umMotorista.setGenero((String) cadMotorista.cbGenero.getSelectedItem());
        java.util.Date dt = (java.util.Date) cadMotorista.spDataNasc.getValue();
        umMotorista.setDataNascimento(new java.sql.Date(dt.getTime()));
        umMotorista.setHabilitacao(cadMotorista.tfHabilitacao.getText());
        if (cadMotorista.tfID.getForeground().equals(Color.black)) {
            if (maioridade(umMotorista.getDataNascimento())) {
                if (daoMotorista.alterar(umMotorista)) {
                    JOptionPane.showMessageDialog(cadMotorista, "Alterado!");
                } else {
                    JOptionPane.showMessageDialog(cadMotorista, "Não foi possível alterar!",
                            "Erro", JOptionPane.ERROR_MESSAGE);
                }
                limparTela();
                alterar = false;
            } else {
                JOptionPane.showMessageDialog(cadMotorista, "A Idade mínima permitida é de 18 anos");
                cadMotorista.spDataNasc.requestFocus();
            }
        } else {
            JOptionPane.showMessageDialog(cadMotorista, "O campo 'ID' é inválido!");
            cadMotorista.tfID.requestFocus();
        }
    }
}
